/**
 * 
 */
package com.cplsystems.incidencias.vm.empresa;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.zkoss.bind.BindContext;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.image.AImage;
import org.zkoss.image.Image;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.util.Clients;

import com.cplsystems.incidencias.app.utils.ImageUtils;
import com.cplsystems.incidencias.app.utils.IncidenciasConstants;
import com.cplsystems.incidencias.app.utils.IncidenciasUtils;
import com.cplsystems.incidencias.business.ClavePersonal;
import com.cplsystems.incidencias.business.Domicilio;
import com.cplsystems.incidencias.business.Organizacion;
import com.cplsystems.incidencias.business.OrganizacionDomicilio;
import com.cplsystems.incidencias.vm.empresa.utils.EmpresaVariables;

/**
 * @author César Palalía López (csr.plz@aisa-automation.com)
 * 
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class EmpresaVM extends EmpresaVariables {

	private static final long serialVersionUID = -4947242108067565504L;

	@Init
	public void init() {
		super.init();
		loadCompanyDetails();
	}

	@Command
	@NotifyChange("municipiosCatalogo")
	public void getMunicipiosByEstado() {
		municipiosCatalogo = municipioService
				.getMunicipioByEstado(estadoSeleccionado);
		municipioSeleccionado = municipiosCatalogo.get(0);
	}

	@NotifyChange("*")
	@Command
	public void saveChanges() {
		organizacionService.save(organizacion);
		organizacionDomicilio.getDomicilio()
				.setMunicipio(municipioSeleccionado);
		organizacionDomicilioService.save(organizacionDomicilio);
		clavePersonal.setUsuario(IncidenciasUtils.encrypt(clavePersonal
				.getUsuario()));
		clavePersonal.setClave(IncidenciasUtils.encrypt(clavePersonal
				.getClave()));
		clavePersonal.setPersona(organizacion.getResponsable());
		clavePersonalService.save(clavePersonal);
		IncidenciasUtils.showMessage(
				"La información ha sido guardada correctamente",
				Clients.NOTIFICATION_TYPE_INFO, 4000);
		super.init();
	}

	@Command
	public void buscarCompania() {
	}

	@GlobalCommand
	@NotifyChange({ "*" })
	public void loadDatosCompania(
			@BindingParam("organizacionSeleccionada") Organizacion organizacionSeleccionada) {
		if (organizacionSeleccionada != null) {
			organizacion = organizacionSeleccionada;
			responsable = organizacion.getResponsable();
			clavePersonal = clavePersonalService.getClaveByCEO(organizacion
					.getResponsable());
			clavePersonal = clavePersonal == null ? new ClavePersonal()
					: clavePersonal;
			clavePersonal.setUsuario(IncidenciasUtils.decrypt(clavePersonal
					.getUsuario()));
			clavePersonal.setClave(IncidenciasUtils.decrypt(clavePersonal
					.getClave()));
			cuentaHabilitada = clavePersonal.getActivo() == null
					|| !clavePersonal.getActivo() ? "false" : "true";
			clavePersonal.setClaveRepetida(clavePersonal.getClave());
			organizacionDomicilio = organizacionDomicilioService
					.getByOrganizacion(organizacion);
			organizacionDomicilio = organizacionDomicilio != null ? organizacionDomicilio
					: new OrganizacionDomicilio();
			organizacionDomicilio.setOrganizacion(organizacionDomicilio
					.getOrganizacion() != null ? organizacionDomicilio
					.getOrganizacion() : organizacion);
			organizacionDomicilio.setDomicilio(organizacionDomicilio
					.getDomicilio() != null ? organizacionDomicilio
					.getDomicilio() : new Domicilio());
			/*
			 * municipioSeleccionado = organizacionDomicilio.getDomicilio()
			 * .getMunicipio(); estadoSeleccionado =
			 * municipioSeleccionado.getEstado();
			 */
			try {
				if (organizacion.getImagenPerfil() == null) {
					return;
				}
				File picture = new File(organizacion.getImagenPerfil());
				imageInBytes = incidenciasUtils.readFileToByteArray(picture);
				businessImage = (AImage)ImageUtils.scaleToSize(imageInBytes, 250, 400,
						"png").getContent();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Command
	public void enableDisableAccount() {
		if (cuentaHabilitada.equals("true")) {
			clavePersonal.setActivo(true);
		} else {
			clavePersonal.setActivo(false);
		}
	}

	@Command
	@NotifyChange("*")
	public void uploadProfilePicture(
			@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
		UploadEvent event = (UploadEvent) ctx.getTriggerEvent();
		Media mediaObj = event.getMedia();
		if (!(mediaObj instanceof Image)) {
			return;
		}
		Image imageRetrieved = (Image) mediaObj;

		try {
			imageInBytes = imageRetrieved.getByteData();
			imageFormat = imageRetrieved.getFormat();
			File perfilPictureFile = new File("C://" + organizacion.getNombre()
					+ ".png");
			FileOutputStream fos = new FileOutputStream(perfilPictureFile);
			fos.write(imageInBytes);
			fos.close();
			organizacion.setImagenPerfil(perfilPictureFile.getPath());
			businessImage = (AImage)ImageUtils.scaleToSize(imageInBytes, 250, 400,
					imageFormat).getContent();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void loadCompanyDetails() {
		organizacion = (Organizacion) sessionUtils
				.getFromSession(IncidenciasUtils
						.encrypt(IncidenciasConstants.FIRMA));
		if (organizacion != null) {
			responsable = organizacion.getResponsable();
			clavePersonal = clavePersonalService.getClaveByCEO(organizacion
					.getResponsable());
			clavePersonal = clavePersonal == null ? new ClavePersonal()
					: clavePersonal;
			clavePersonal.setUsuario(IncidenciasUtils.decrypt(clavePersonal
					.getUsuario()));
			clavePersonal.setClave(IncidenciasUtils.decrypt(clavePersonal
					.getClave()));
			cuentaHabilitada = clavePersonal.getActivo() == null
					|| !clavePersonal.getActivo() ? "false" : "true";
			clavePersonal.setClaveRepetida(clavePersonal.getClave());
			organizacionDomicilio = organizacionDomicilioService
					.getByOrganizacion(organizacion);
			organizacionDomicilio = organizacionDomicilio != null ? organizacionDomicilio
					: new OrganizacionDomicilio();
			organizacionDomicilio.setOrganizacion(organizacionDomicilio
					.getOrganizacion() != null ? organizacionDomicilio
					.getOrganizacion() : organizacion);
			organizacionDomicilio.setDomicilio(organizacionDomicilio
					.getDomicilio() != null ? organizacionDomicilio
					.getDomicilio() : new Domicilio());

			municipioSeleccionado = organizacionDomicilio.getDomicilio()
					.getMunicipio();
			if (municipioSeleccionado != null) {
				estadoSeleccionado = municipioSeleccionado.getEstado();	
			}			

			servicioSeleccionado = organizacion.getServicios();

			try {
				if (organizacion.getImagenPerfil() == null) {
					return;
				}
				File picture = new File(organizacion.getImagenPerfil());
				imageInBytes = incidenciasUtils.readFileToByteArray(picture);
				businessImage = (AImage)ImageUtils.scaleToSize(imageInBytes, 250, 400,
						"png").getContent();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Command
	public void asignarServicio() {
		if (servicioSeleccionado != null) {
			organizacion.setServicios(servicioSeleccionado);
		} else {
			IncidenciasUtils.showMessage(
					"Por favor seleccione el servicio que se deséa prestar",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
		}
	}

}
